package com.atguigu.bigdata.spark.zzgcore.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Classname Spark01_RDD_Operation_Transfrom
 * @Description 相同的首字母放在一个组中
 * @Date 2023/9/20 15:23
 * @Author zhuzhenguo
 */
object Spark17_RDD_Operation_Transform {
  def main(args: Array[String]): Unit = {
    // 准备环境,这个 *表示系统当前最大可用核数
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)
    // k-v类型
    val rdd: RDD[(String, Int)] = sc.makeRDD(List(("a", 1), ("a", 2), ("a", 3), ("a", 4)), 2)
    // (a, [1,2]),(a,[3,4]) => (a,2),(a,4) => (a,6)
    // aggregateByKey存在函数的柯里化，有两个参数列表
    // 第一个参数列表,需要传递一个参数，表示为初始值
    //         主要用于当碰到第一个key的时候，和value进行分区内计算
    // 第二个参数列表：需要传递两个参数
    //        第一个参数表示分区内计算规则
    //        第二个参数表示分区间计算规则
    rdd.aggregateByKey(0)((x, y) => math.max(x, y), (x, y) => x + y).collect().foreach(println)
    // 关闭环境
    sc.stop()
  }
}
